package org.colour.amber.service;

import com.google.common.collect.Lists;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.colour.amber.logic.server.ServerChecker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;

/**
 * @author jasonfu
 * @date 2024/9/14 09:41
 */
@Slf4j
@Service
public class PingService {

    @Autowired
    ApplicationContext applicationContext;

    /**
     * 执行服务器Ping操作，检查所有服务器的运行状态
     *
     * 该方法通过获取Spring上下文中所有ServerChecker类型的Bean，遍历这些Bean并使用它们的isActive方法
     * 检查对应服务器的运行状态然后将检查结果封装到ServerChecker.CheckResult对象中，最终返回一个
     * 包含所有服务器检查结果的列表
     *
     * @return 包含所有服务器Ping结果的列表，每个结果都包含服务器的名称和当前是否活跃的状态
     */
    public List<ServerChecker.CheckResult> ping() {
        // 初始化检查结果列表
        List<ServerChecker.CheckResult> checkResultList = Lists.newArrayList();
        // 从Spring上下文中获取所有ServerChecker类型的Bean
        Map<String, ServerChecker> serverCheckerMap = applicationContext.getBeansOfType(ServerChecker.class);
        // 遍历所有ServerChecker类型的Bean，执行活跃性检查，并将结果添加到检查结果列表中
        serverCheckerMap.forEach(
                (s, checker) -> checkResultList.add(new ServerChecker.CheckResult(checker.name(), checker.isActive())));
        // 返回检查结果列表
        return checkResultList;
    }
}
